package com.xgsm.Fmmall.service.impl;

import com.xgsm.Fmmall.Untils.MD5Until;
import com.xgsm.Fmmall.dao.UsersMapper;
import com.xgsm.Fmmall.entity.Users;
import com.xgsm.Fmmall.service.UserService;
import com.xgsm.Fmmall.vo.ResultState;
import com.xgsm.Fmmall.vo.ResultVo;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.HashMap;
import java.util.List;


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UsersMapper usersMapper;
    //创建MD5加密算法的工具类对对象
    MD5Until md5Until = new MD5Until();

    @Override
    public ResultVo checkLoginin(String userName, String password) {
//        根据账号查询用户信息
//        条件查询
        Example example = new Example(Users.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("username", userName);

        List<Users> users = usersMapper.selectByExample(example);
        if (users.size() < 0) {
//     用户不存在
            return new ResultVo(1, "用户名不存在", null);
        } else {
//            对输入的密码pwd进行加密(MD5)
            String pwd = md5Until.getMD5(password);

//            使用加密后的密码和user中的密码进行匹配
            if (users.get(0).getPassword().equals(pwd)) {
//                验证成功
//                生成token并返回
                JwtBuilder builder = Jwts.builder();
                HashMap<String,Object> map = new HashMap<>();
                map.put("userInfo",users.get(0));

                String token = builder.setSubject(userName) //主题，也就是token所携带的数据
                    .setIssuedAt(new Date()) //设置token的生成时间
                    .setId(users.get(0).getUserId()+"") //设置用户id为token的id（需要的数据是字符串）
                    .setClaims(map) //map中可以存放用户权限信息
                    .setExpiration(new Date(System.currentTimeMillis()+24*60*60*1000)) //设置token的过期时间
                    .signWith(SignatureAlgorithm.HS256,"xiaguangshumo") //设置加密方式和加密密码
                    .compact();
                return new ResultVo(ResultState.OK, token, users);

            } else {
                return new ResultVo(ResultState.NO, "密码错误", users);
            }

        }
    }

    @Override
    public ResultVo registerUser(Users users) {
        if (users != null) {
            Example example = new Example(Users.class);
            Example.Criteria criteria = example.createCriteria();
//            查询用户名是否存在
            criteria.andEqualTo("username", users.getUsername());
//           将传进来的参数当做条件进行查询
            List<Users> userIsExist = usersMapper.selectByExample(example);
            if (userIsExist.size() > 0) {//该用户名已经被使用
                return new ResultVo(0, "用户名已经存在", null);
            } else {
//                将传递过来的密码进行加密
                String md5pwd = md5Until.getMD5(users.getPassword());
                users.setPassword(md5pwd);
                int i = usersMapper.insert(users);

            }

        }
        return new ResultVo(ResultState.OK, "注册成功", null);
    }
}
